package com.qf;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 演示线程池的基本用法
 */
public class ThreadPoolDemo {

    public static void main(String[] args) throws InterruptedException {

        //1. 创建线程池对象
        /**
         * 核心线程数量：3，涵义：当提交任务时，先检查线程池中的线程数量是否达到了核心数量，如果没有，直接创建新线程放入线程池中执行任务。如果达到核心数，则进入等待队列
         * 最大线程数：5。含义：如果等待队列中的位置已经被沾满了，检查线程数量是否达到了最大线程数，如果没有，则继续创建新线程；如果达到了，就执行任务拒绝策略。
         * 超时时间+时间单位：如果线程池中的线程数量超过核心数量，并且线程空闲，那么每个指定时间间隔都将检查空闲线程并且关闭，最后保留核心大小个线程。
         * 等待队列：当提交的任务数量超过核心线程数时，会先进等待队列。
         */
        ThreadPoolExecutor pool = new ThreadPoolExecutor(3,5,10, TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(2),new ThreadPoolExecutor.CallerRunsPolicy());

        System.out.println(pool);

        for (int i=0;i<8;i++) {
            try {
                pool.execute(new Runnable() {
                    @Override
                    public void run() {
                        System.out.println(Thread.currentThread().getName()+"开始任务");
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                        System.out.println(Thread.currentThread().getName()+"完成任务");
                    }
                });
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        System.out.println(pool);
        Thread.sleep(3000);
        System.out.println(pool);


        pool.shutdown();// 关闭线程池

    }

}
